package it.scambiocorse.ajax;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import it.scambiocorse.dao.AreaService;
import it.scambiocorse.dao.ClienteService;
import it.scambiocorse.dao.ServizioService;
import it.scambiocorse.dao.UtenteService;
import it.scambiocorse.model.AutistaType;
import it.scambiocorse.model.JTableType;
import it.scambiocorse.model.ServizioJson;
import it.scambiocorse.model.ServizioType;
import it.scambiocorse.model.SorgenteType;
import it.scambiocorse.model.UtenteType;
import it.scambiocorse.utils.Costanti;
import it.scambiocorse.utils.LabelValueBean;
import it.scambiocorse.utils.Utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.mvc.multiaction.*;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class AjaxController extends  MultiActionController {
	private ServizioService servizioDao = null;
	private AreaService areaDao = null;
	private UtenteService utenteDao = null;
	private ClienteService clienteDao = null;

	

	public AreaService getAreaDao() {
		return areaDao;
	}
	public void setAreaDao(AreaService areaDao) {
		this.areaDao = areaDao;
	}
	public ServizioService getServizioDao() {
		return servizioDao;
	}
	public void setServizioDao(ServizioService servizioDao) {
		this.servizioDao = servizioDao;
	}
	public UtenteService getUtenteDao() {
		return utenteDao;
	}
	public void setUtenteDao(UtenteService utenteDao) {
		this.utenteDao = utenteDao;
	}
	public ClienteService getClienteDao() {
		return clienteDao;
	}
	public void setClienteDao(ClienteService clienteDao) {
		this.clienteDao = clienteDao;
	}	



	final Logger logger = Logger.getLogger(getClass());


	
	@Override 
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
			return super.handleRequest(request, response);
	}
	

	public ModelAndView newServizio(HttpServletRequest request, HttpServletResponse response, ServizioJson s) throws Exception {
		UtenteType dettaglio =  null;
		try {
			logger.warn("newServizio");
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			HashMap j = new HashMap<String, Object>();
			
			int check = 0;
			try {
				s.setIdUserInse(dettaglio.getIdUser());
				s.getCliente().setIdUser(dettaglio.getIdUser());
				check =  servizioDao.inserisciServizio(s);
				if (check > 0) { 
					s = (ServizioJson) servizioDao.dettaglioServizioIdServ(check, dettaglio.getIdUser());
					j.put("Record", s);
				}
				j.put("Result", "OK");
			}
			catch (Exception e) {j.put("Result", "KO");}
			
			sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	public ModelAndView editServizio(HttpServletRequest request, HttpServletResponse response, ServizioJson s) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> editServizio");
		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			HashMap j = new HashMap<String, Object>();
			
			int check = 0;
			try {
				s.setIdUserInse(dettaglio.getIdUser());
				check =  servizioDao.modificaServizio(s);
				if (check > 0) { 
					s = (ServizioJson) servizioDao.dettaglioServizioIdServUser(s.getIdServUser(), dettaglio.getIdUser());
					j.put("Record", s);
				}
				j.put("Result", "OK");
			}
			catch (Exception e) {j.put("Result", "KO");}
			
			sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
		
	public ModelAndView deleteServizio(HttpServletRequest request, HttpServletResponse response, ServizioJson s) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> deleteServizio");
		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			HashMap j = new HashMap<String, Object>();
			
			int check = 0;
			try {
				check =  servizioDao.eliminaServizio(s.getIdServ(), dettaglio.getIdUser());
				if (check > 0) 
					j.put("Result", "OK");
				else
					j.put("Result", "KO");
			}
			catch (Exception e) {j.put("Result", "KO");}
			
			sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}

	public ModelAndView loadServizi(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadServizi");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
				String dataIniz = request.getParameter("dataIniz");
				String dataFine = request.getParameter("dataFine");
//				ArrayList<ServizioType6> listaServizi =  servizioDao.listaServiziIdUser(dettaglio.getIdUser(), dataIniz, dataFine);
				HashMap j =  servizioDao.listaServiziIdUserJTable(dettaglio.getIdUser(), dataIniz, dataFine, jTfilter );
				
				sendJson(response, j);
				

				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	

//	@SuppressWarnings("unchecked")
//	public ModelAndView getSorgentiAjax(HttpServletRequest request, HttpServletResponse response, String idSorgente) throws Exception {
//		UtenteType dettaglio =  null;
//		try {
//			HttpSession session = request.getSession(false);
//			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
//				session = request.getSession(true);
//				logger.warn("Sessione Scaduta");
//				return new ModelAndView("expired");
//			} else {
//				dettaglio = (UtenteType)session.getAttribute("dettaglio");
//			}
//				ArrayList<SorgenteType> listaSorgenti = areaDao.listaSorgentiIdUser(dettaglio.getIdUser());
//				HashMap j = new HashMap<String, Object>();
//				
//				j.put("Result", "OK");
//
//				ArrayList listaJson = new ArrayList();
//				for (SorgenteType s : listaSorgenti) {
//					HashMap jj = new HashMap<String, Object>();
//					jj.put("DisplayText", s.getNome());
//					jj.put("Value", s.getIdSorgente());
//					listaJson.add(jj);
//				}
//				
//				j.put("Options", listaJson);
//
//				
//				sendJson(response, j);
//				
//				return null;
//				
//		}catch (Exception e) {
//			logger.error("SI E' VERIFICATO UN ERRORE");
//			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
//			logger.error(e);
//			return new ModelAndView("gestioneErrore").addObject(e);
//		}
//	}
//	
//	@SuppressWarnings("unchecked") // METODO SOLO PER L'EDIT dalla lista servizi
//	public ModelAndView getAutistiAjax(HttpServletRequest request, HttpServletResponse response, ServizioJson s) throws Exception {
//		UtenteType dettaglio =  null;
//		try {
//			HttpSession session = request.getSession(false);
//			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
//				session = request.getSession(true);
//				logger.warn("Sessione Scaduta");
//				return new ModelAndView("expired");
//			} else {
//				dettaglio = (UtenteType)session.getAttribute("dettaglio");
//			}
//				ArrayList<AutistaType> listaAutisti = areaDao.listaAutistiIdUser(dettaglio.getIdUser());
//				HashMap j = new HashMap<String, Object>();
//				
//				j.put("Result", "OK");
//				
//				
//				
//				//RIORDINO LA TABELLA PER FAR COMPARIRE LA SELECT GIUSTA SELEZIONATA IN EDIT
//				if (s != null) {
//				AutistaType appo = null;
//					for (AutistaType a : listaAutisti) {
//						if (a.getIdAutista() == s.getAutista().getIdAutista() ) {
//							appo = a;
//							listaAutisti.remove(a);
//							listaAutisti.add(0, appo);
//							
//						}
//					}
//				}
//				// FINE SORTING
//				
//				
//				
//				ArrayList listaJson = new ArrayList();
//				for (AutistaType a : listaAutisti) {
//					HashMap jj = new HashMap<String, Object>();
//					jj.put("DisplayText", a.getNome());
//					jj.put("Value", a.getIdAutista());
//					listaJson.add(jj);
//				}
//				
//				j.put("Options", listaJson);
//
//				sendJson(response, j);
//				
//				return null;
//				
//		}catch (Exception e) {
//			logger.error("SI E' VERIFICATO UN ERRORE");
//			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
//			logger.error(e);
//			return new ModelAndView("gestioneErrore").addObject(e);
//		}
//	}
	
	

	public ModelAndView loadCollaboratori(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadCollaboratori");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
				HashMap j =  areaDao.listaCollaboratoriIdUserJTable(dettaglio.getIdUser(),jTfilter );
				sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	public ModelAndView deleteCollaboratore(HttpServletRequest request, HttpServletResponse response, AutistaType a) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> deleteCollaboratore");
		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			HashMap j = new HashMap<String, Object	>();
			
			boolean check = false;
			try {
				check =  areaDao.eliminaCollaboratore(a.getIdAutista(), dettaglio.getIdUser());
				
				
				if (check) 
					j.put("Result", "OK");
				else
					j.put("Result", "KO");
			}
			catch (Exception e) {j.put("Result", "KO");}
			
			sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	
	public ModelAndView editCollaboratore(HttpServletRequest request, HttpServletResponse response, AutistaType a) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> editCollaboratore");
		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			HashMap j = new HashMap<String, Object>();
			
			boolean check = false;
			try {
				a.setIdUserInse(dettaglio.getIdUser());
				check =  areaDao.modificaCollaboratore(a);
				if (check) { 
					a = (AutistaType) areaDao.dettaglioCollaboratore(a.getIdAutista(), dettaglio.getIdUser());
					j.put("Record", a);
				}
				j.put("Result", "OK");
			}
			catch (Exception e) {j.put("Result", "KO");}
			
			sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	public ModelAndView newCollaboratore(HttpServletRequest request, HttpServletResponse response, AutistaType a) throws Exception {
		UtenteType dettaglio =  null;
		try {
			logger.warn("newSorgente");
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			HashMap j = new HashMap<String, Object>();
			
			int check = 0;
			try {
				a.setIdUserInse(dettaglio.getIdUser());
				
				check =  areaDao.inserisciAutista(a);
				
				if (check > 0) { 
					a = (AutistaType) areaDao.dettaglioCollaboratore(check, dettaglio.getIdUser());
					j.put("Record", a);
				}
				j.put("Result", "OK");
			}
			catch (Exception e) {j.put("Result", "KO");}
			
			sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	
	
	
	public ModelAndView loadServiziCollaboratore(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadCollaboratori");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
				
			HashMap j =  servizioDao.listaServiziAutistaJtable(jTfilter.getId(), dettaglio.getIdUser(), jTfilter ,null, null);
			sendJson(response, j);
				
			return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	public ModelAndView dettaglioCliente(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadCollaboratori");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
			String dataIniz = request.getParameter("dataIniz");
			String dataFine = request.getParameter("dataFine");
			

			HashMap j =  servizioDao.listaServiziClientiJtable(jTfilter.getId(), dettaglio.getIdUser(), jTfilter ,dataIniz, dataFine);
			sendJson(response, j);
				
			return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	public ModelAndView loadClienti(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadCollaboratori");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
				HashMap j =  clienteDao.listaClientiIdUserJTable(dettaglio.getIdUser(),jTfilter );
				sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	
	private void sendJson(HttpServletResponse response, HashMap j) throws IOException {
		Gson g = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
		response.setContentType("application/json");
		PrintWriter out = response.getWriter();
		out.print(g.toJson(j));
		out.flush();
		out.close();
		logger.warn("Procedo al invio di servizi JSON ");
	}
	
	private ModelAndView sessioneScaduta(HttpServletRequest request, HttpServletResponse response) throws Exception  {
		logger.debug("Sessione scaduta, procedo al redirect");
		return new ModelAndView("expired");
		
	}	
	
	
	
		

}
